package cc.verywell.pureblock.msg.nfs.idx.extraDownload;

import java.io.IOException;
import java.util.List;
import java.util.function.BiConsumer;

import cc.verywell.pureblock.func.node.KeyShell;
import cc.verywell.pureblock.msg.nfs.idx.NfsidxStructure;
import cc.verywell.pureblock.msg.nfs.idx.extraUpload.UploadingMonitor;
import cc.verywell.pureblock.util.BasicEntry;

/**
* 
* Copyright © 2019 TanYaqiu. All rights reserved.
* @author TanYaqiu 
* @address flat 601
* @date 2019年10月3日 下午1:44:50
*/
public interface DownloadNeed {
	
	/**
	 * 尝试在内部立即返回数据库
	 * 
	 * 对于如果有些数据是正在其它地方做种的exernal==true, 这部分数据是否需要Hold的问题;
	 * 我个人倾向于不需要，因为exernal==true在现在20200204肯定是纯数据；
	 * 所以只要这个参数返回成功，而且**不是纯数据**，则一律用holdInternal锁定本地表;
	 * @param key
	 * @return
	 */
	byte[] getLocalData(KeyShell key);
	//应由UPLOAD代理 void holdInternal(Object hold,KeyShell key) throws IOException;
	/**
	 * 所获得的远程数据，会在func中返回,(可能不会被内部store;)
	 * @param key
	 * @param func
	 */
	void getRemoteData(BiConsumer<KeyShell,byte[]> func,KeyShell... key);
	void cancelRemoteDownload(BiConsumer<KeyShell,byte[]> func,KeyShell... key);//可能无法实现
	
	/**
	 * 当获得一个有结构的数据包时，如果选择做种，则需要将此数据包put到内部并hold住;
	 * @param hold
	 * @param key
	 * @param value
	 * @return
	 * @throws IOException
	 */
	//应由UPLOAD代理void putAndHoldInternal(Object hold,KeyShell key,byte[] value) throws IOException;//需要在此函数内异步推送newStored(key)
	//应由UPLOAD代理void removeHold(Object lock);
//	/**
//	 * 在文件上的纯数据，开始做种后要推举这个，才会开始在网络上传播;
//	 * @param key
//	 */
//	void newStored(KeyShell key);
	
	//做种包;
	public UploadingMonitor getUploadMonitor(String absolutePath);
	

}
